#include "exit.h"

static void IRAM_ATTR exit_gpio17_isr_handler(void *arg)    //这里的IRAM_ATTR属性用于将中断处理函数存储在内部RAM中，目的在于减少延迟
{
    uint32_t gpio_num = (uint32_t) arg;
    
    if (gpio_num == GPIO_NUM_17)
    {
        gpio_set_level(GPIO_NUM_1,!gpio_get_level(GPIO_NUM_1));
    }
}

static void IRAM_ATTR exit_gpio18_isr_handler(void *arg)    //这里的IRAM_ATTR属性用于将中断处理函数存储在内部RAM中，目的在于减少延迟
{
    uint32_t gpio_num = (uint32_t) arg;
    
    if (gpio_num == GPIO_NUM_18)
    {
        gpio_set_level(GPIO_NUM_1,!gpio_get_level(GPIO_NUM_1));
    }
}


void exit_io17_init(void)
{
    gpio_config_t gpio_init_struct;

    /* 配置BOOT引脚和外部中断 */
    gpio_init_struct.mode = GPIO_MODE_INPUT;                    /* 选择为输入模式 */
    gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;           /* 上拉使能 */
    gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE;      /* 下拉失能 */
    gpio_init_struct.intr_type = GPIO_INTR_NEGEDGE;             /* 下降沿触发 */
    gpio_init_struct.pin_bit_mask = 1ull << GPIO_NUM_17;  /* 配置BOOT按键引脚 */
    gpio_config(&gpio_init_struct);                             /* 配置使能 */
    
    /* 注册中断服务 */
    gpio_install_isr_service(0);
    
    /* 设置GPIO的中断回调函数 */
    gpio_isr_handler_add(GPIO_NUM_17, exit_gpio17_isr_handler, (void*) GPIO_NUM_17);
}

void exit_io18_init(void)
{
    gpio_config_t gpio_init_struct;

    /* 配置BOOT引脚和外部中断 */
    gpio_init_struct.mode = GPIO_MODE_INPUT;                    /* 选择为输入模式 */
    gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;           /* 上拉使能 */
    gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE;      /* 下拉失能 */
    gpio_init_struct.intr_type = GPIO_INTR_LOW_LEVEL;             /* 低电平触发 */
    gpio_init_struct.pin_bit_mask = 1ull << GPIO_NUM_18;  /* 配置BOOT按键引脚 */
    gpio_config(&gpio_init_struct);                             /* 配置使能 */
    
    /* 注册中断服务 */
    gpio_install_isr_service(0);
    
    /* 设置GPIO的中断回调函数 */
    gpio_isr_handler_add(GPIO_NUM_18, exit_gpio18_isr_handler, (void*) GPIO_NUM_18);
}

